﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Metriks.Parsiranje.Klase;

namespace Metriks.Parsiranje
{
    public static class Struktura
    {
        private static Stack<Cvor> stekCvorova = new Stack<Cvor>();
        private static Stack<Cvor> tempovi = new Stack<Cvor>();
        public static Cvor pocetniCvor(List<LOC> lista) {
            stekCvorova = new Stack<Cvor>();
            tempovi = new Stack<Cvor>();
            Cvor prvi = new Cvor("Start");
            Cvor trenutni=null;
            Cvor prethodni=null;
            Cvor ulazWhile=null;
            Cvor temp=null;
            bool imaElse = false;
            LOC prethodniLOC=lista[0];
            bool izasaoWhile = false;
            trenutni = prvi;
            foreach(LOC l in lista){
                Cvor novi = null;
                if (l is Comment || l is emptyLine) continue;
                else if (l is beginIf)
                {
                    novi = new Cvor("IF");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                    }
                    else
                    {
                        trenutni.Cvorovi.Add(novi);
                    }
                    stekCvorova.Push(novi);
                    prethodni = trenutni;
                    trenutni = novi;
                    continue;
                }
                else if (l is beginWhile)
                {
                    novi = new Cvor("WHILE");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                    }
                    else
                    {
                        trenutni.Cvorovi.Add(novi);
                    }
                    stekCvorova.Push(novi);
                    prethodni = trenutni;
                    trenutni = novi;
                    continue;
                }
                else if (l is endWhile)
                {
                    novi = new Cvor("ENDWHILE");
                    trenutni.Cvorovi.Add(novi);
                    ulazWhile = stekCvorova.Pop();
                    novi.Cvorovi.Add(ulazWhile);
                    izasaoWhile = true;

                    //prethodni = trenutni;
                    //trenutni = novi;

                    prethodni = novi;
                    trenutni = ulazWhile;

                    continue;
                }
                else if (l is beginElse)
                {
                    novi = new Cvor("ELSE");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                    }
                    tempovi.Push(trenutni);
                   // temp = trenutni;
                    stekCvorova.Peek().Cvorovi.Add(novi);
                    stekCvorova.Push(novi);
                    prethodni = trenutni;
                    trenutni = novi;
                    imaElse = true;
                    continue;
                }
                else if (l is endIf)
                {
                    novi = new Cvor("ENDIF");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                    }
                    else
                    {
                        trenutni.Cvorovi.Add(novi);
                    }
                    if (tempovi.Count != 0)
                    {
                        tempovi.Pop().Cvorovi.Add(novi);
                       // temp = null;
                    }
                    Cvor naSteku = stekCvorova.Pop();
                    if (naSteku.Tip == "ELSE")
                    {
                        //naSteku.Cvorovi.Add(novi);
                        stekCvorova.Pop();
                    }
                    else {
                        naSteku.Cvorovi.Add(novi);
                    }
                    prethodni = trenutni;
                    trenutni = novi;
                    continue;
                }
                else if (l is elseIf)
                {
                    novi = new Cvor("ELSIF");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                    }
                    else
                    {
                        trenutni.Cvorovi.Add(novi);
                    }
                    stekCvorova.Push(novi);
                    prethodni = trenutni;
                    trenutni = novi;
                    continue;
 
                }
                else if (prethodniLOC is beginIf || prethodniLOC is beginWhile || prethodniLOC is endIf || prethodniLOC is endWhile || prethodniLOC is beginFunction || prethodniLOC is endFunction || prethodniLOC is beginElse || prethodniLOC is elseIf) {
                    novi = new Cvor("Flow");
                    if (izasaoWhile)
                    {
                        ulazWhile.Cvorovi.Add(novi);
                        prethodni = trenutni;
                        trenutni = novi;
                        izasaoWhile = false;
                        continue;
                    }
                    else {
                        trenutni.Cvorovi.Add(novi);
                        prethodni = trenutni;
                        trenutni = novi;
                        continue;
                    }
                }
                else if (l is varAssign || l is varDecl || l is varInit) {
                    if (prethodniLOC.GetType() != typeof(varAssign) || prethodniLOC.GetType() != typeof(varDecl) || prethodniLOC.GetType() != typeof(varInit)) {
                        novi = new Cvor("Flow");
                        trenutni.Cvorovi.Add(novi);
                        prethodni = trenutni;
                        trenutni = novi;
                    }
                }
                prethodniLOC = l;
            }
            Cvor noviC = new Cvor("Final");
//             if (izasaoWhile)
//             {
//                 ulazWhile.Cvorovi.Add(noviC);
//             }
//             else
//             {
                trenutni.Cvorovi.Add(noviC);
//            }
            return prvi;
        }
    }
}
